package com.qf.sclg.service.impl;

import com.alibaba.fastjson.JSONArray;
import com.qf.sclg.dao.OrderDao;
import com.qf.sclg.entity.Order;
import com.qf.sclg.exception.BusinessException;
import com.qf.sclg.result.ResponseCode;
import com.qf.sclg.service.OrderService;
import com.qf.sclg.util.SendSms;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;

/**
 * (Order)表服务实现类
 *
 * @author 
 * @since 2021-10-11 16:33:13
 */
@Service("orderService")
public class OrderServiceImpl implements OrderService {

    @Resource
    private OrderDao orderDao;

    /**
     * 通过ID查询单条数据
     *
     * @param oId 主键
     * @return 实例对象
     */
    @Override
    public Order queryById(Integer oId) {
        return this.orderDao.queryById(oId);
    }



    /**
     * 新增数据
     *
     * @param order 实例对象
     * @return 实例对象
     */
    @Override
    public Order insert(Order order) {
        this.orderDao.insert(order);
        return order;
    }

    /**
     * 修改数据
     *
     * @param order 实例对象
     * @return 实例对象
     */
    @Override
    public Boolean update(Order order) {
        int i = orderDao.update(order);
        if(i>0){
            return true;
        }else{
            return false;
        }
    }

    /**
     * 通过主键删除数据
     *
     * @param oId 主键
     * @return 是否成功
     */

    @Override
    public boolean deleteById(Integer oId) {
        return this.orderDao.deleteById(oId) > 0;
    }

    /**
     * 阿里云的短信平台的接入
     *事务的处理---事务回滚（容易造成try--catch滥用）
     * 例子：插入10条数据必须一次性成功
     * 如果中间有错，全部取消
     * 事务：要么成功，要么失败
     * 事务只有在程序抛出运行时异常或者error错时才会自动回滚
     * 数据库持久操作：除查询
     *处理：全局异常处理
     * @param order
     * @return
     */
//    只要异常，都进行回滚，try catch不会触动自动回滚
    @Transactional(rollbackFor = Exception.class)
    @Override
//    不使用try catch
    public String order(Order order) throws Exception{
//        try {
//            //判断手机号是否为空
//            if (order.getTel() != null) {
//                return "手机号异常";
//            }
//            //先发送短信
//            String code = SendSms.Sms(order.getTel());
//            if (code == null){
//                return "短信发送异常";
//            }
//            // 发送成功过后，记录添加到数据库中
////        提交时间，状态需要默认设置（0），验证码
////        设置当前时间
//            order.setSubtime(new Date());
//            order.setStatus(0);
//            order.setCode(code);
////            对数据库进行持久化操作
//            int i = orderDao.insert(order);
//            if(i < 1){
//                return "sql异常";
//            }
////            手动设置错误
//            int j =1/0;
//        } catch (Exception e) {
//            e.printStackTrace();
////   抛出运行时异常 ,但会导致程序终止
////   throw new RuntimeException();
////            是使用try……catch需要手动设置回滚
////            会麻烦，更改：全局异常捕获操作
//            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
//
//        }
        //判断手机号是否为空
//        if (order.getTel() != null) {
//            return "手机号异常";
//        }

        //先发送短信
        String code = SendSms.Sms(order.getTel());
        if (code == null){
            return "短信发送异常";
        }
        // 发送成功过后，记录添加到数据库中
//        提交时间，状态需要默认设置（0），验证码
//        设置当前时间
        order.setSubtime(new Date());
        order.setStatus(0);
        order.setCode(code);
//            对数据库进行持久化操作
        int i = orderDao.insert(order);
//      i<1,会报异常并上抛
        if(i < 1){
            throw new BusinessException(ResponseCode.SQLEXCEPTION);
        }
        return "success";
    }

    @Override
    public List<Order> queryAll() {
        List<Order> orders = orderDao.queryAll();
        return orders;
    }

    @Transactional(rollbackFor = Exception.class)
    @Override
    public Boolean deleteByIds(JSONArray idArr) {
        Integer i = orderDao.deleteByIds(idArr);
        if (i>0){
            return true;
        }else {
            return false;
        }
    }

    @Override
    public List<Order> queryByConditions(Order order) {
        List<Order> orders = orderDao.queryByConditions(order);
        return orders;
    }

}
